package gsw.tool.pluggable.hook.hook;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;

import gsw.tool.pluggable.hook.handler.BaseHandlerMethod;

/**
 * 使用InvocationHandler装饰的Hook类。
 * Hook时，需要使用动态代理扩展系统对象，扩展功能通过InvocationHandler.invoke()实现，
 */
public abstract class BaseHookProxy extends BaseHook implements InvocationHandler {

    @Override
    public abstract void onInit(ClassLoader classLoader);

    /**
     * 监听系统对象所有的方法，对指定的方法进行扩展
     *
     * @param o      代理对象
     * @param method 执行方法
     * @param args   执行方法的参数
     * @return 执行方法的返回结果
     */
    @Override
    public Object invoke(Object o, Method method, Object[] args) throws Throwable {
        //如果Hook点不可用，直接执行系统的方法
        if (!isEnable()) {
            return method.invoke(realObj, args);
        }
        //通过策略模式，获取具体的方法方法
        BaseHandlerMethod baseMethodHandle = classHandle.getHookMethodHandler(method.getName());
        //执行分发方法
        if (baseMethodHandle != null) {
            return baseMethodHandle.doHookInnner(realObj, method, args);
        } else {
            return method.invoke(realObj, args);
        }
    }
}
